package cn.spring.framework.redis.core;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

/**
 * @author xingkong
 * @Title: StringOperator
 * @Description: 字符串操作
 * @date 2021/11/12 17:21
 */
public interface StringOperator {
    /**
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则调用Refresher获取最新缓存数据
     *
     * @param key     键值
     * @param expire  缓存不存在数据或者缓存过期时，填充缓存时的过期时间，单位毫秒
     * @param flusher 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return 字符串
     */
    String get(String key, long expire, Refresher<String> flusher);

    /**
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     * 刷新缓存时，控制只有一个线程可以刷新缓存
     *
     * @param key     键值
     * @param expire  缓存不存在数据或者缓存过期时，填充缓存时的过期时间，单位毫秒
     * @param flusher 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return Future 对象
     */
    Future<String> getAsync(String key, long expire, Refresher<String> flusher);

    /**
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     * 刷新缓存时，控制只有一个线程可以刷新缓存
     *
     * @param key             键值
     * @param expire          缓存不存在数据或者缓存过期时，填充缓存时的过期时间，单位毫秒
     * @param flusher         当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @param executorService 指定以线程池实现
     * @return Future 对象
     */
    Future<String> getAsync(String key, long expire, Refresher<String> flusher, ExecutorService executorService);

    /**
     * 删除键
     *
     * @param key 键
     */
    void del(String key);

}
